package com.AdvancedDemos.Stream流操作;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Stream流练习2 {
    public static void main(String[] args) {
        ArrayList<String> team1 = new ArrayList<>();
        team1.add("陈玄风");
        team1.add("梅超风");
        team1.add("风清扬");
        team1.add("解风");
        team1.add("风波恶");
        team1.add("陆乘风");
        team1.add("曲灵风");
        team1.add("武眠风");
        team1.add("冯默风");
        team1.add("陆小风");
        ArrayList<String> team2 = new ArrayList<>();
        team2.add("宋远桥");
        team2.add("俞莲舟");
        team2.add("俞岱岩");
        team2.add("张松溪");
        team2.add("张翠山");
        team2.add("殷梨亭");
        team2.add("莫声谷");

        /*    请使用流依次完成如下操作：*/
// 1、从第一个队伍中筛选出名字为3个字并且以“风”字结尾的人，筛选之后，只保留前6个。
// stream() + filter() + limit()
        team1.stream().filter(new Predicate<String>() {
            @Override
            public boolean test(String s) {
                return s.length() == 3 && s.endsWith("风");
            }
        }).limit(6).forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
                //陈玄风
                //梅超风
                //陆乘风
                //曲灵风
                //武眠风
                //冯默风
            }
        });
        System.out.println("---------------");
// 2、从第二个队伍中筛选出姓张的人员，筛选之后，不要第一个。
// stream() + filter() + skip()
        team2.stream().filter(new Predicate<String>() {
            @Override
            public boolean test(String s) {
                return s.startsWith("张");
            }
        }).skip(1).forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
                //张翠山
            }
        });
        System.out.println("---------------");

// 3、将两个筛选结果合并为一个队伍。
// Stream.concat()
        Stream.concat(team1.stream(), team2.stream()).forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
                //陈玄风
                //梅超风
                //风清扬
                //解风
                //风波恶
                //陆乘风
                //曲灵风
                //武眠风
                //冯默风
                //陆小风
                //宋远桥
                //俞莲舟
                //俞岱岩
                //张松溪
                //张翠山
                //殷梨亭
                //莫声谷
            }
        });
        System.out.println("---------------");

// 4、将结果队伍中的字符串姓名作为Student对象的属性，创建Student对象，将集合中的元素都更改为Student类型。
// map()
        Stream<String> concat = Stream.concat(team1.stream(), team2.stream());
        Stream<Stu> stuStream = concat.map(new Function<String, Stu>() {
            @Override
            public Stu apply(String s) {
                return new Stu(s);
            }
        });
//        stuStream.forEach(System.out::println);
        //Stu{name='陈玄风'}
        //Stu{name='梅超风'}
        //Stu{name='风清扬'}
        //Stu{name='解风'}
        //Stu{name='风波恶'}
        //Stu{name='陆乘风'}
        //Stu{name='曲灵风'}
        //Stu{name='武眠风'}
        //Stu{name='冯默风'}
        //Stu{name='陆小风'}
        //Stu{name='宋远桥'}
        //Stu{name='俞莲舟'}
        //Stu{name='俞岱岩'}
        //Stu{name='张松溪'}
        //Stu{name='张翠山'}
        //Stu{name='殷梨亭'}
        //Stu{name='莫声谷'}
        System.out.println("---------------");

// 5、将Student对象收集到新的List集合中
// collect(Collectors.toList())
        List<Stu> collect = stuStream.collect(Collectors.toList());
// 6.打印新集合中对象信息
// 增强for forEach iterator
        Iterator<Stu> iterator = collect.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
            //Stu{name='陈玄风'}
            //Stu{name='梅超风'}
            //Stu{name='风清扬'}
            //Stu{name='解风'}
            //Stu{name='风波恶'}
            //Stu{name='陆乘风'}
            //Stu{name='曲灵风'}
            //Stu{name='武眠风'}
            //Stu{name='冯默风'}
            //Stu{name='陆小风'}
            //Stu{name='宋远桥'}
            //Stu{name='俞莲舟'}
            //Stu{name='俞岱岩'}
            //Stu{name='张松溪'}
            //Stu{name='张翠山'}
            //Stu{name='殷梨亭'}
            //Stu{name='莫声谷'}
        }
        System.out.println("---------------");

    }
}

class Stu {
    private String name;

    public Stu() {
    }

    public Stu(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Stu{" +
                "name='" + name + '\'' +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
